package naturezaChamado;

import naturezaChamado.excecao.LimiteNaturezasChamadoAtingidoException;
import naturezaChamado.excecao.NaturezaChamadoNaoEncontradaException;

public class RepositorioNaturezaChamadoArray implements IRepositorioNaturezaChamado {
 
        private static NaturezaChamado[] naturezas = new NaturezaChamado[100];
	 
	public void cadastrar(NaturezaChamado natureza) throws LimiteNaturezasChamadoAtingidoException {
            int posicaoArray = getPosicaoLivre();
            
            if (posicaoArray == -1) {
                throw new LimiteNaturezasChamadoAtingidoException();
            }                                    
            
            natureza.setId(posicaoArray + 1);            
            
            naturezas[posicaoArray] = natureza;            
	}
	 
	public void alterar(NaturezaChamado natureza) throws NaturezaChamadoNaoEncontradaException {
            naturezas[getIndice(natureza.getId())] = natureza;
	}
	 
	public void excluir(int id) throws NaturezaChamadoNaoEncontradaException {
            if (idCadastrado(id)) {                                
                int i = getIndice(id);                
                
                while (i < naturezas.length) {                    
                    if (naturezas[i + 1] != null) {
                        naturezas[i] = naturezas[i + 1];
                        i++;
                    } else {
                        break;
                    }
                }
                
                naturezas[i] = null;
            } else {
                throw new NaturezaChamadoNaoEncontradaException();
            }            
	}
	 
	public NaturezaChamado consultar(int id) throws NaturezaChamadoNaoEncontradaException {
            return naturezas[getIndice(id)];             
	}
	 
	public NaturezaChamado[] consultar() {
            return naturezas;
	}

        private boolean idCadastrado(int id) {
            for (int i = 0; i < naturezas.length; i++) {
                if (((NaturezaChamado) naturezas[i]).getId() == id) {
                    return true;
                }
            }
            
            return false;
        }        
        
        private int getIndice(int id) throws NaturezaChamadoNaoEncontradaException {
            for (int i = 0; i < naturezas.length; i++) {
                if (naturezas[i].getId() == id) {
                    return i;                    
                }
            }
            
            throw new NaturezaChamadoNaoEncontradaException();
        }        
        
        public int getTamanho() {
            if (naturezas != null) {
                return naturezas.length;
            } else {
                return 0;
            }
        }
        
        private int getPosicaoLivre() {
            for (int i = 0; i < naturezas.length; i++) {
                if (naturezas[i] == null) {
                    return i;
                }
            }
            return -1;
        }	 
}
 
